package twitter;

import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Hashtable;

public class EspacioVectorial {
	
	public static int DIMENSION;
	public static String[] VEC_ATRIB;

	private Tokenizador tokenizador;
	private ArrayList<String> arrayTwitts;
	private IdentificadorNombres namesIdentifier;
	private Hashtable<String, Integer> tablahashAbre = new Hashtable<String, Integer>();
	//private HashSet<String> palabrasImportantes = new HashSet<String>();
	
	private String[] abreviaturas = {"MD","NC","NN","NNS","NNS$","NP","NP$","NNP"};
	//private String[] abreviaturas = {"BE","BED","BEDZ","BEG","BEM","BER","BEZ","DO","DOD","DOZ","FW","HV","HVD","HVG","HVN","JJ","JJR","JJJ","JJR","JJT","MD","NC","NN","NNS","NNS$","NP","NP$","NNP","VB","VBD","VBN","VBP","VBZ"};
	private IdentificadorNombres locationsIdentifier;
	private ArrayList<TwittProcesado> twittsprocesados = new ArrayList<TwittProcesado>();
	private ArrayList<ArrayList<String>> twitsTokenizados;
	
	public EspacioVectorial(ArrayList<String> tweets){
		arrayTwitts = tweets;
		twitsTokenizados = new ArrayList<ArrayList<String>>();
		for(int i = 0; i<abreviaturas.length; i++){
			tablahashAbre.put(abreviaturas[i], i);
		}
	}
	
	public void crearVectores(){
	  tokenizador = new Tokenizador();
	  HashSet<String> palabrasImportantes = new HashSet<String>();
      for(int i = 0;i<arrayTwitts.size();i++){
	    try {
	    	
	      String twittActual = arrayTwitts.get(i);
		  namesIdentifier = new IdentificadorNombres("en-ner-person.bin");
		
		  ArrayList<String> twitTokenizado = namesIdentifier.joinNombrePersonasCiudades(tokenizador.tokenizar(twittActual));
		  twitsTokenizados.add(twitTokenizado);
		  namesIdentifier = null;
		  locationsIdentifier = new IdentificadorNombres("en-ner-location.bin");
		
		  twitTokenizado = locationsIdentifier.joinNombrePersonasCiudades(twitTokenizado.toArray(new String[0]));
		  locationsIdentifier = null;	
		
		  System.out.println(twitTokenizado);
		  
		  String[] etiquetas = new EtiquetaPalabras("en-pos-maxent.bin").etiquetar(twitTokenizado.toArray(new String[0]));
		  //String aux;
		  TwittProcesado twittprocesado = new TwittProcesado(twittActual);
		  
		  for (int j = 0; j < twitTokenizado.size(); j++) {

			System.out.print(twitTokenizado.get(j)+"_");
			System.out.print(etiquetas[j]+ " ");
			//aux = twitTokenizado.get(j)+"_"+etiquetas[j];
			if(tablahashAbre.get(etiquetas[j]) != null){
				twittprocesado.aniadePalabraImportante(twitTokenizado.get(j));//palabrasImportantes.add(etiquetas[j]);
				palabrasImportantes.add(twitTokenizado.get(j));
			}
			
		  }
		  System.out.println();
		  System.out.println("******************************");
		  twittsprocesados.add(twittprocesado);
		  //DE MOMENTO LO DEJAMOS ES LO DE LA LECTURA DEL XML
		 /* File ficheroXML = new File("abreviatura.xml");
		  XMLReader lectorxml = new XMLReader(ficheroXML,twitTokenizado);
		  lectorxml.expandirAbreviaturas();*/
	     } catch (FileNotFoundException e) {
		// TODO Auto-generated catch block
		   e.printStackTrace();
	     }//catch
      }//foR
      DIMENSION = palabrasImportantes.size();
      VEC_ATRIB = palabrasImportantes.toArray(new String[0]);
      System.out.println("***********Palabras del espacio Vectorial***************");
      for (int i=0; i<VEC_ATRIB.length; i++)
    	  System.out.print(VEC_ATRIB[i] + " ");
      System.out.println();
      System.out.println("Dimension del espacio: "+ DIMENSION);
      //palabrasImportantes =null;
      for(int y=0;y<twittsprocesados.size();y++){
    	  twittsprocesados.get(y).inicializaVector();
    	  for(int i=0;i<twittsprocesados.get(y).getPalabrasImportantes().size();i++){
    		  int contador = aparicionDistintosTweets(twittsprocesados.get(y).getPalabrasImportantes().get(i));
    		  double idf = 0;
    		  if(contador != 0){
    			  idf = java.lang.Math.sqrt(java.lang.Math.log(arrayTwitts.size()/contador));
    		  }	  
    		  twittsprocesados.get(y).meteridfs(twittsprocesados.get(y).getPalabrasImportantes().get(i), idf);
    	  }
      }
      
	}//metodo
	
	public int aparicionDistintosTweets(String palabra){
		int apariciones = 0;
		for(int x = 0; x<twitsTokenizados.size();x++){
			for(int j=0;j<twitsTokenizados.get(x).size();j++){
				String token = twitsTokenizados.get(x).get(j);
				if(palabra.equals(token)){
					apariciones++;
				}
			}
		}
		return apariciones;
	}

	public ArrayList<TwittProcesado> getTweetsProcesados() {
		return twittsprocesados;
	}
}//clase
